
public class Test {
    public static void main(String[] args) {
        // Java的注解可以分为三类：
        // 第一类是由编译器使用的注解，例如：
        // @Override：让编译器检查该方法是否正确地实现了覆写；
        // @SuppressWarnings：告诉编译器忽略此处代码产生的警告。
        // 第二类是由工具处理.class文件使用的注解，
        // 比如有些工具会在加载class的时候，对class做动态修改，实现一些特殊的功能
        // 第三类是在程序运行期能够读取的注解，它们在加载后一直存在于JVM中，这也是最常用的注解。
        // 例如，一个配置了@PostConstruct的方法会在调用构造方法后自动被调用（这是Java代码读取该注解实现的功能，JVM并不会识别该注解）

    }
}

// 定义一个注解时，还可以定义配置参数。
// 配置参数可以包括：
// 1、所有基本类型；
// 2、String；
// 3、枚举类型；
// 4、基本类型、String、Class以及枚举的数组。
@interface Check {
    int min() default 0;

    int max() default 100; // 可以用default设定一个默认值（强烈推荐）。

    int value() default 0;  // 最常用的参数应当命名为value, 使用可以不写参数名
}

class Hello {
    @Override
    public String toString() {
        return "Hello";
    }

    @Check(min = 0, max = 100, value = 55)
    public int n;

    @Check(value = 99)
    public int p;

    @Check(99) // @Check(value=99)
    public int x;

    @Check
    public int y;
}
